package com.pmc.prototipo.beans;

import com.pmc.prototipo.entities.TipoUsuario;
import com.pmc.prototipo.entities.Usuario;
import com.pmc.prototipo.services.ISecurityServiceLocal;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

/**
 * Clase que modela el backing bean que se encarga de la seguridad del sistema.
 */
public class SecurityBean {

    // -----------------------------------------------
    // Constantes
    // -----------------------------------------------
    /**
     * Constante que modela el valor de error en la operación de ingreso al sistema.
     */
    private final static String ERROR = "ERROR";

    // -----------------------------------------------
    // Atributos
    // -----------------------------------------------
    /**
     * Login del usuario que esta utilizando el sistema.
     */
    private String username;
    /**
     * Contraseña del usuario que se encuentra utilizando el sistema.
     */
    private String pwd;
    /**
     * Relación con la interfaz que provee los servicios necesarios de seguridad para el sistema.
     */
    @EJB
    private ISecurityServiceLocal securityService;

    private Usuario user;
    // -----------------------------------------------
    // Constructor
    // -----------------------------------------------

    /**
     * Constructor por defecto de la clase.
     */
    public SecurityBean() {
    }

    // -----------------------------------------------
    // Métodos
    // -----------------------------------------------
    /**
     * Hace la validacion de ingreso del usuario al sistema.
     * @return tipoUsuario. El tipo de usuario que está utilizando el sistema.
     */
    public String login() {
        try {
            user = securityService.login(username, pwd);
            if (user.getTipoUsuario() == TipoUsuario.ADMINISTRADOR) {
                return "menu";
            } else {
                return "cliente";
            }
        } catch (Exception ex) {
            FacesContext context = FacesContext.getCurrentInstance();
            String msg = ex.getMessage();
            FacesMessage fm = new FacesMessage(msg);
            fm.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, fm);
            Logger.getLogger(SecurityBean.class.getName()).log(Level.SEVERE, null, ex);
            return ERROR;
        }
    }

    /**
     * Retorna la contraseña del usuario que se encuentra actualmente en el sistema.
     * @return pwd. Contraseña del usuario que se encuentra actualment en el sistema.
     */
    public String getPwd() {
        return pwd;
    }

    /**
     * Permite asignar la contraseña del usuario que se encuentra actualmente en el sistema.
     * @param pwd. Nueva contraseña.
     */
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    /**
     * Retorna el login del usuario que se encuentra actualmente en el sistema.
     * @return username. Login del usuario que se encuentra actualmente en el sistema.
     */
    public String getUsername() {
        return username;
    }

    /**
     * Permite asignar el login del usuario que se encuentra actualmente en el sistema.
     * @param username. Nuevo login.
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * Retorna el usuario que al que pertenece la sesión en curso.
     * @return
     */
    public Usuario getUser() {
        return user;
    }

    /**
     * Deslogea al cliente propietario de la sesión en curso, luego remueve este bean de la misma sesión.
     * @return
     */
    public String logout(){
        user=null;
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("SecurityBean");
        return "login";
    }
}